﻿#include <iostream>

// 定义链表节点结构体
struct ListNode {
    int val;
    ListNode* next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode* next) : val(x), next(next) {}
};

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* H = new ListNode();
        ListNode* ptr = H;

        int carry = 0;
        while (l1 || l2 || carry) {
            int val = carry;
            if (l1) val += l1->val, l1 = l1->next;
            if (l2) val += l2->val, l2 = l2->next;

            ListNode* node = new ListNode(val % 10);
            ptr->next = node;
            ptr = node;
            carry = val / 10;
        }
        return H->next;
    }
};

int main() {
    // 构建第一个链表，代表数字 342（逆序存储，个位在前）
    ListNode* l1 = new ListNode(2);
    ListNode* node1 = new ListNode(4);
    ListNode* node2 = new ListNode(3);
    l1->next = node1;
    node1->next = node2;

    // 构建第二个链表，代表数字 465（逆序存储，个位在前）
    ListNode* l2 = new ListNode(5);
    ListNode* node3 = new ListNode(6);
    ListNode* node4 = new ListNode(4);
    l2->next = node3;
    node3->next = node4;

    Solution solution;
    ListNode* result = solution.addTwoNumbers(l1, l2);

    // 输出结果链表，也就是两个数字相加后的结果（逆序输出）
    while (result) {
        std::cout << result->val;
        result = result->next;
    }
    std::cout << std::endl;

    return 0;
}
